package com.store.app.push;

import android.app.Activity;
import android.app.Notification;
import android.content.Context;
import android.os.Handler;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.Toast;

import com.store.app.R;

import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.jpush.android.api.BasicPushNotificationBuilder;
import cn.jpush.android.api.CustomPushNotificationBuilder;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;
import cn.jpush.android.data.JPushLocalNotification;

public class PushUtils {

    public Context mContext;

    PushUtils(Context context) {
        this.mContext = context;
    }


    /**
     * 处理由于网络连接不稳定设置失败
     * @param alias
     */
    public void setSafeAlias(String alias) {

        // 调用 Handler 来异步设置别名
        mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, alias));
    }
    private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
        @Override
        public void gotResult(int code, String alias, Set<String> tags) {
            switch (code) {
                case 0:
                    // 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后，以后不必再次设置了。
                    break;
                case 6002:
                    // 延迟 60 秒来调用 Handler 设置别名
                    mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60);
                    break;
                default:
            }
        }
    };
    private static final int MSG_SET_ALIAS = 1001;
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_SET_ALIAS:
                    // 调用 JPush 接口来设置别名。
                    PushUtils.setAliasAndTags(mContext, (String) msg.obj, null, mAliasCallback);
                    break;
                default:
            }
        }
    };


    /**
     * 关闭推送
     * 不能通过 JPushInterface.init 恢复，需要调用resumePush恢复。
     * context 应用的 ApplicationContext
     */
    public static void stopPush(Context context) {
        JPushInterface.stopPush(context);
    }

    /**
     * 恢复推送服务。
     * 极光推送完全恢复正常工作。
     * context 应用的 ApplicationContext
     */
    public static void resumePush(Context context) {
        JPushInterface.resumePush(context);
    }


    /**
     * 调用此 API 来同时设置别名与标签。
     * TagAliasCallback这个接口是覆盖逻辑，而不是增量逻辑。即新的调用会覆盖之前的设置。
     * 在TagAliasCallback 的 gotResult 方法，返回对应的参数 alias, tags。并返回对应的状态码：0为成功
     * 在之前调用过后，如果需要再次改变别名与标签，只需要重新调用此 API 即可。
     */
    public static void setAliasAndTags(Context context, String alias, Set<String> tags, TagAliasCallback callback) {
        JPushInterface.setAliasAndTags(context, alias, tags, callback);
    }

    /**
     * 调用此 API 来设置别名。
     * TagAliasCallback这个接口是覆盖逻辑，而不是增量逻辑。即新的调用会覆盖之前的设置。
     * 在TagAliasCallback 的 gotResult 方法，返回对应的参数 alias, tags。并返回对应的状态码：0为成功
     */
    public static void setAlias(Context context, String alias, TagAliasCallback callback) {
        JPushInterface.setAlias(context, alias, callback);
    }

    /**
     * 调用此 API 来设置标签。
     * TagAliasCallback这个接口是覆盖逻辑，而不是增量逻辑。即新的调用会覆盖之前的设置。
     * 在TagAliasCallback 的 gotResult 方法，返回对应的参数 alias, tags。并返回对应的状态码：0为成功
     * 如果待设置的 alias / tags 是动态的，有可能在调用 setAliasAndTags 时因为 alias / tags 无效而整调用失败。
     * 调用此方法只设置 tags，可以排除可能无效的 alias 对本次调用的影响。
     */
    public static void setTags(Context context, Set<String> tags, TagAliasCallback callback) {
        JPushInterface.setTags(context, tags, callback);
    }


    /**
     * 设置 tags 时，如果其中一个 tag 无效，则整个设置过程失败。
     * 调用本方法 filterValidTags 来过滤掉无效的 tags，得到有效的 tags，
     * 再调用 JPush SDK 的 set tags / alias 方法。
     */
    public static Set<String> filterValidTags(Set<String> tags) {
        return JPushInterface.filterValidTags(tags);
    }


    /**
     * SDK 初次注册成功后，开发者通过在自定义的 Receiver 里监听 Action - cn.jpush.android.intent.REGISTRATION 来获取对应的 RegistrationID。
     * 注册成功后，也可以通过此函数获取
     * <p/>
     * 通过 RegistrationID 进行点对点推送
     * 可以通过 RegistrationID 来推送消息和通知,当 receiver_type = 5 并且设置 receiver_value 为 RegistrationID 时候即可根据 RegistrationID 推送。
     */
    public static String getRegistrationID(Context context) {
        return JPushInterface.getRegistrationID(context);
    }

    /**
     * 用于“用户使用时长”，“活跃用户”，“用户打开次数”的统计，并上报到服务器，在 Portal 上展示给开发者
     * activity:当前界面的activity
     */
    public static void onResume(final Activity activity) {
        JPushInterface.onResume(activity);
    }

    public static void onPause(final Activity activity) {
        JPushInterface.onPause(activity);
    }

    /**
     * 用于上报用户的通知栏被打开，或者用于上报用户自定义消息被展示等客户端需要统计的事件
     */
    public static void reportNotificationOpened(Context context, String msgId) {
        JPushInterface.reportNotificationOpened(context, msgId);
    }

    /**
     * 清除通知的功能，包括：清除所有 JPush 展现的通知（不包括非 JPush SDK 展现的）；
     *
     * @param context
     */
    public static void clearAllNotifications(Context context) {
        JPushInterface.clearAllNotifications(context);
    }

    /**
     * 清除指定某个通知
     *
     * @param context
     * @param notificationId
     */
    public static void clearNotificationById(Context context, int notificationId) {
        JPushInterface.clearNotificationById(context, notificationId);
    }


    /**
     * 设置允许推送的时间。
     * 如果不在该时间段内收到消息，当前的行为是：推送到的通知会被扔掉
     *
     * @param context
     * @param weekDays  0表示星期天，1表示星期一，以此类推。 （7天制，Set集合里面的int范围为0到6）
     *                  新功能:set的值为null,则任何时间都可以收到消息和通知，set的size为0，则表示任何时间都收不到消息和通知.
     * @param startHour 允许推送的开始时间 （24小时制：startHour的范围为0到23）
     * @param endHour   允许推送的结束时间 （24小时制：endHour的范围为0到23）
     */
    public static void setPushTime(Context context, Set<Integer> weekDays, int startHour, int endHour) {
        JPushInterface.setPushTime(context, weekDays, startHour, endHour);
    }

    /**
     * 设置静音时段。如果在该时间段内收到消息，则：不会有铃声和震动
     *
     * @param context
     * @param startHour   静音时段的开始时间 - 小时 （24小时制，范围：0~23 ）
     * @param startMinute 静音时段的开始时间 - 分钟（范围：0~59 ）
     * @param endHour     静音时段的结束时间 - 小时 （24小时制，范围：0~23 ）
     * @param endMinute   静音时段的结束时间 - 分钟（范围：0~59 ）
     */
    public static void setSilenceTime(Context context, int startHour, int startMinute, int endHour, int endMinute) {
        JPushInterface.setSilenceTime(context, startHour, startMinute, endHour, endMinute);
    }

    /**
     * 申请权限
     *
     * @param context
     */
    public static void requestPermission(Context context) {
        JPushInterface.requestPermission(context);
    }


    /**
     * 获取当前连接状态
     * 在自定义的Receiver监听cn.jpush.android.intent.CONNECTION获取变化的状态，也可通过API主动获取
     *
     * @param context
     * @return
     */
    public static boolean getConnectionState(Context context) {
        return JPushInterface.getConnectionState(context);
    }


    /**
     * 添加一个本地通知
     *
     * @param context
     * @param notification 本地通知对象
     */
    public static void addLocalNotification(Context context, JPushLocalNotification notification) {
        JPushInterface.addLocalNotification(context, notification);
    }

    /**
     * 移除本地通知
     *
     * @param context
     */
    public static void clearLocalNotifications(Context context) {
        JPushInterface.clearLocalNotifications(context);

    }


    /**
     * 校验Tag Alias 只能是数字,英文字母和中文
     */
    public static boolean isValidTagAndAlias(String s) {
        Pattern p = Pattern.compile("^[\u4E00-\u9FA50-9a-zA-Z_!@#$&*+=.|]+$");
        Matcher m = p.matcher(s);
        return m.matches();
    }

    /**
     * 设置通知提示方式 - 基础属性
     */
    public static void setStyleBasic(Context context) {
        BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(context);
        builder.statusBarDrawable = R.mipmap.ic_launcher;
        builder.notificationFlags = Notification.FLAG_AUTO_CANCEL;  //设置为点击后自动消失
        builder.notificationDefaults = Notification.DEFAULT_SOUND;  //设置为铃声（ Notification.DEFAULT_SOUND）或者震动（ Notification.DEFAULT_VIBRATE）
        JPushInterface.setPushNotificationBuilder(1, builder);
        Toast.makeText(context, "Basic Builder - 1", Toast.LENGTH_SHORT).show();
    }


    /**
     * 设置通知栏样式 - 定义通知栏Layout
     */
    private static void setStyleCustom(Context context, int layout, int icon, int title, int text) {
        CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(context, layout, icon, title, text);
//		CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(context,R.layout.customer_notitfication_layout,R.id.icon, R.id.title, R.id.text);
//		builder.layoutIconDrawable = R.mipmap.ic_launcher;
//		builder.developerArg0 = "developerArg2";
        JPushInterface.setPushNotificationBuilder(2, builder);
//		Toast.makeText(context,"Custom Builder - 2", Toast.LENGTH_SHORT).show();
    }


}
